import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'

Vue.use(VueRouter)
/*重写push和replace方法，让在编程式路由导航时对此点击不会报错
* 第一个参数location是去往下一个路由的地址
* 第二个参数resolve是成功的回调
* 第三个参数reject是失败的回调*/
const push = VueRouter.prototype.push;
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        push.call(this, location, resolve, reject)
    } else {
        push.call(this, location, () => {
        }, () => {
        })
    }
}

const replace = VueRouter.prototype.replace;

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        replace.call(this, location, resolve, reject)
    } else {
        replace.call(this, location, () => {
        }, () => {
        })
    }
}

const router = new VueRouter({
    mode: 'hash',
    base: import.meta.env.BASE_URL,
    routes,
    // 控制导航条行为
    scrollBehavior() {
        // 回到顶部
        return {y: 0}
    }
})
// 引入store
import store from "@/store";


/*全局前置路由守卫，初始化的时候被调用、每次路由切换之前被调用*/
// next:放行 to:到哪儿个路由 from:
router.beforeEach(async (to, from, next) => {
        if (store.state.user.token !== '') {
            // 登陆之后不能去到登陆页面，重定向到home主页
            if (to.path === '/login' || to.path === '/register') {
                next('/home')
            }
            // 判断userInfo是否是空对象
            if (JSON.stringify(store.state.user.userInfo) === '{}') {
                try {
                    // 再次派发action
                    await store.dispatch('getUserInfo');
                    next();
                } catch (e) {
                    // token过期，让其重新登陆
                    await store.dispatch('logout')
                    // 跳转至login
                    next('/login')
                }
            } else {
                // 没有登陆就没有限制
                next()
            }
        } else {
            // 去往目的路由的地址
            let toPath = to.path
            // 未登录访问，交易相关（trade)、支付相关(pay、paySuccess)、用户中心(center)相关跳转专到登录页面
            if (!to.meta.login) {
                // 创建query参数，到login组件路由跳转判断，使得登陆之后去往没去成的页面
                next('/login?redirect='+toPath)
            } else {
                next()
            }
        }
    }
)

export default router
